package tt.dz.util.Nosql.Jedis.Connect;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 使用jedis插件,连接redis服务器
 * @author peizhide
 *
 */
//@Service @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class JedisConnect {

	private static JedisPool pool = null;  
	
	@Value(value="${redis.connect.ip}")
	private String ip;
	@Value(value="${redis.connect.port}")
	private int port;
	@Value(value="${redis.connect.maxConn}")
	private int maxConn;
	@Value(value="${redis.connect.maxIdle}")
	private int maxIdle;
	@Value(value="${redis.connect.minIdle}")
	private int minIdle;
	@Value(value="${redis.connect.timeout}")
	private long timeout;
	@Value(value="${redis.connect.testOnBorrow}")
	private boolean testOnBorrow;
	@Value(value="${redis.connect.testOnReturn}")
	private boolean testOnReturn;
	
    public JedisConnect(){
    	try {
			JedisConnect.init(ip, port, maxConn, maxIdle, minIdle, timeout, testOnBorrow, testOnReturn);
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    /**
     * 初始化redis连接池
     * @param ip ip地址
     * @param port 端口
     * @param maxConn 最大连接数
     * @param maxIdle 最大空闲数:空闲链接数大于maxIdle时,将进行回收
     * @param minIdle 最小空闲数:低于minIdle时,将创建新的链接
     * @param timeout 超时时间:单位ms
     * @param onBoorrow 使用连接时,检测连接是否成功
     * @param onReturn 返回连接时,检测连接是否成功 
     * @throws Exception
     */
    public static void init(String ip, int port, int maxConn, int maxIdle, int minIdle,long timeout,boolean onBoorrow,boolean onReturn) throws Exception{
    	JedisPoolConfig config = new JedisPoolConfig();
        // 控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;  
        // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。  
        config.setMaxTotal(maxConn);
        
        // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。  
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; 
        config.setMaxWaitMillis(timeout); 
        // 在borrow一个jedis实例时,是否提前进行validate操作；如果为true,则得到的jedis实例均是可用的;
        // 当调用borrow Object方法时,是否进行有效性检查
        config.setTestOnBorrow(onBoorrow);  
        // 当调用Return Object方法时,是否进行有效性检查
        config.setTestOnReturn(onReturn);
        pool = new JedisPool(config, ip, port);
    }
    
    /**
     * 获取对象池对象
     * @return
     * @throws Exception
     */
    public static Jedis getConnect() throws Exception{
    	return pool == null ? null : pool.getResource();  	
    }
    
    /**
     * 释放对象池对象
     * @param connnect
     */
    @SuppressWarnings("deprecation")
	public static void releaseConnect(Jedis connnect){
    	pool.returnResource(connnect);
    }
}
